import path from 'path'
import { rmSync } from 'fs'

import { defineConfig } from 'vite'
import typescript2 from 'rollup-plugin-typescript2' // 用于处理TypeScript编译错误的插件，它可以帮助我们检测并解决在打包过程中出现的TypeScript编译错误
import obfuscator from 'rollup-plugin-obfuscator' // 混淆代码
import compressPlugin from 'vite-plugin-compression' // gzip压缩
import terser from '@rollup/plugin-terser' // 压缩代码

// 清除缓存的函数
function clearTsCache() {
  const cacheDir = './node_modules/.cache/rollup-plugin-typescript2'
  rmSync(cacheDir, { recursive: true, force: true })
}

clearTsCache()

// https://vite.dev/config/
export default defineConfig({
  plugins: [
    typescript2({
      tsconfig: 'tsconfig-sdk.json',
      tsconfigOverride: {
        compilerOptions: {
          target: 'ES5',
          module: 'ESNext',
          strict: false,
          declaration: false,
          declarationMap: false,
          sourceMap: false,
          noImplicitAny: false,
          noImplicitThis: false,
          strictPropertyInitialization: false,
        },
      },
      check: false,
    }),
    obfuscator({
      options: {
        inputFileName: 'src/sdk/test.ts',
      },
    }),
    compressPlugin({
      verbose: true,
      disable: false,
      threshold: 10240,
      algorithm: 'gzip',
      ext: '.gz',
    }),
    terser({
      ecma: 2015,
      compress: {
        drop_console: true, // 去掉console.*
        drop_debugger: true, // 去掉debugger
        pure_funcs: ['console.log'], // 以数组形式定义纯函数
      },
      output: {
        comments: false,
      },
    }),
  ],
  build: {
    outDir: 'dist', //输出文件名称
    //库编译模式配置
    lib: {
      entry: path.resolve(__dirname, 'src/sdk/test.ts'), //指定组件编译入口文件
      name: 'sdkTest', // 指定库名称
      fileName: (format) => `sdkTest.${format}.js`, // 打包后的文件名
      formats: ['umd', 'es'], // 指定构建格式
    },
    // rollup打包配置
    rollupOptions: {
      // 确保外部化处理那些你不想打包进库的依赖
      external: ['vue'],
      output: {
        // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
        globals: {
          vue: 'Vue',
        },
        // 确保正确导出
        exports: 'named',
      },
    },
  },
})
